package main

import (
    "fmt"
    "math/rand"
 
    "time"
)

//

// 定义任务函数，返回任务执行是否成功及错误信息
type taskResult struct {
    success bool
    err     error
}

// 任务A，模拟执行并返回结果
func executeTaskA() taskResult {
    fmt.Println("执行任务 A...")
    time.Sleep(time.Second * 2)
    // 生成随机数模拟成功或失败
    randomNumber := rand.Intn(10)
    if randomNumber >=4 {
        fmt.Println("任务 A 完成成功")
        return taskResult{success: true, err: nil}
    } else {
        fmt.Println("任务 A 失败")
        return taskResult{success: false, err: fmt.Errorf("任务 A 失败")}
    }
}

// 任务B，依赖任务A，模拟执行并返回结果
func executeTaskB(executeTask taskResult) taskResult {
    fmt.Println("执行任务 B...")
    if !executeTask.success {
        fmt.Println("由于任务 A 失败，任务 B 回滚")
        return taskResult{success: false, err: fmt.Errorf("任务 B 因任务 A 失败而回滚")}
    }
    time.Sleep(time.Second * 2)
    // 生成随机数模拟成功或失败
    randomNumber := rand.Intn(10)
    if randomNumber >=4 {
        fmt.Println("任务 B 完成成功")
        return taskResult{success: true, err: nil}
    } else {
        fmt.Println("任务 B 失败")
        return taskResult{success: false, err: fmt.Errorf("任务 B 失败")}
    }
}

// 任务C，依赖任务B，模拟执行并返回结果
func executeTaskC(executeTask taskResult) taskResult {
    fmt.Println("执行任务 C...")
    if !executeTask.success {
        fmt.Println("由于任务 B 失败，任务 C 回滚")
        return taskResult{success: false, err: fmt.Errorf("任务 C 因任务 B 失败而回滚")}
    }
    time.Sleep(time.Second * 2)
    // 生成随机数模拟成功或失败
    randomNumber := rand.Intn(10)
    if randomNumber >=4 {
        fmt.Println("任务 C 完成成功")
        return taskResult{success: true, err: nil}
    } else {
        fmt.Println("任务 C 失败")
        return taskResult{success: false, err: fmt.Errorf("任务 C 失败")}
    }
}

func main() {

	A := executeTaskA()

	if !A.success {
		fmt.Println("整体任务执行失败：", A.err)
	}


	B:= executeTaskB(A)
	if !B.success {
		fmt.Println("整体任务执行失败：", B.err)
	}

	C :=executeTaskC(B)
	if !C.success {
	fmt.Println("整体任务执行失败：", C.err)
	}
	
}
